import axios from 'axios'

// 克隆对象并设置基地址
const request = axios.create({
    baseURL: 'http://geek.itheima.net/'
})

import store from '@/store'
// 请求拦截要加给request,因为我们项目中的请求都是由request发的
request.interceptors.request.use(function (config) {

    // 如果有token我才加token,没有token就不加了
    if (store.state.tokenObj.token) {
        // 添加token到headers,注意Bearer后面要有一个空格的!
        config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }
    return config

}, function (error) {

    return Promise.reject(error)
})


import router from '@/router'
import {
    Toast
} from 'vant'

// 添加响应拦截器
request.interceptors.response.use(
    function (response) {
        // 对响应数据做点什么
        return response;
    },
    async function (error) {

        // 先判断是不是401错误,error就是错误信息对象
        if (error.response.status === 401) {

            // 利用refresh_token去获取最新token
            // 所以发请求
            // 这里不能用request对象发请求
            // 因为用request会触发请求拦截，所以明明我在这里加了refresh_token
            // 但是触发请求拦截后，会用过期的token把refresh_token给覆盖了，所以服务器报500错误
            // 所以一朝回到解放前，用axios发即可
            // 但是用axios要设置完整的地址，因为axios没有配置基地址
            try {
                // 就是刷新token的代码

                let res = await axios({
                    url: 'http://toutiao.itheima.net/v1_0/authorizations',
                    method: 'put',
                    headers: {
                        Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
                    }
                })

                // 拿到最新token保存到vuex和本地存储
                // 调用vuex的方法就行了
                // 注意：要给vuex赋值的是一个对象，对象里要有token和refresh_token两个属性
                // token就给刚刚刷新得到的最新token
                // refresh_token就用原来的即可
                store.commit('changeToken', {
                    token: res.data.data.token,
                    refresh_token: store.state.tokenObj.refresh_token
                })
                return request(error.config)
            } catch {
                router.push('/login')
                // 弹出提示
                Toast.fail('登录状态失效，请重新登录')
                return Promise.reject(error);
            }
        }

        return Promise.reject(error);
    });

// 暴露出去
export default request